package com.zzjx.common.service.Impl;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzjx.common.service.ISuperService;

/**
 * service实现父类
 *
 * @author yjy
 * @date 2019/1/10
 */
public class SuperServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements ISuperService<T> {
    /**
     * 幂等性新增记录
     * 例子如下：
     * String username = sysUser.getUsername();
     * boolean result = super.saveIdempotency(sysUser, lock
     *                 , LOCK_KEY_USERNAME+username
     *                 , new QueryWrapper<SysUser>().eq("username", username));
     *
     * @param entity       实体对象
     * @param lock         锁实例
     * @param lockKey      锁的key
     * @param countWrapper 判断是否存在的条件
     * @param msg          对象已存在提示信息
     * @return
     */
//    @Override
//    public boolean saveIdempotency(T entity, DistributedLock lock, String lockKey, Wrapper<T> countWrapper, String msg) {
//        if (lock == null) {
//            throw new LockException("DistributedLock is null");
//        }
//        if (StrUtil.isEmpty(lockKey)) {
//            throw new LockException("lockKey is null");
//        }
//        try {
//            //加锁
//            boolean isLock = lock.lock(lockKey);
//            if (isLock) {
//                //判断记录是否已存在
//                int count = super.count(countWrapper);
//                if (count == 0) {
//                    return super.save(entity);
//                } else {
//                    if (StrUtil.isEmpty(msg)) {
//                        msg = "已存在";
//                    }
//                    throw new IdempotencyException(msg);
//                }
//            } else {
//                throw new LockException("锁等待超时");
//            }
//        } finally {
//            lock.releaseLock(lockKey);
//        }
//    }
//
//    /**
//     * 幂等性新增记录
//     *
//     * @param entity       实体对象
//     * @param lock         锁实例
//     * @param lockKey      锁的key
//     * @param countWrapper 判断是否存在的条件
//     * @return
//     */
//    @Override
//    public boolean saveIdempotency(T entity, DistributedLock lock, String lockKey, Wrapper<T> countWrapper) {
//        return saveIdempotency(entity, lock, lockKey, countWrapper, null);
//    }
//
//    /**
//     * 幂等性新增或更新记录
//     * 例子如下：
//     * String username = sysUser.getUsername();
//     * boolean result = super.saveOrUpdateIdempotency(sysUser, lock
//     *                 , LOCK_KEY_USERNAME+username
//     *                 , new QueryWrapper<SysUser>().eq("username", username));
//     *
//     * @param entity       实体对象
//     * @param lock         锁实例
//     * @param lockKey      锁的key
//     * @param countWrapper 判断是否存在的条件
//     * @param msg          对象已存在提示信息
//     * @return
//     */
//    @Override
//    public boolean saveOrUpdateIdempotency(T entity, DistributedLock lock, String lockKey, Wrapper<T> countWrapper, String msg) {
//        if(null == entity){
//            return false;
//        }
//
//        Class<?> cls = entity.getClass();
//        TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
//        if (null != tableInfo && StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
//            Object idVal = ReflectionKit.getMethodValue(cls, entity, tableInfo.getKeyProperty());
//            if (StringUtils.checkValNull(idVal) || Objects.isNull(getById((Serializable) idVal))) {
//                if (StrUtil.isEmpty(msg)) {
//                    msg = "已存在";
//                }
//                return this.saveIdempotency(entity, lock, lockKey, countWrapper, msg);
//            } else {
//                return updateById(entity);
//            }
//        } else {
//            throw ExceptionUtils.mpe("Error:  Can not execute. Could not find @TableId.");
//        }
//
//
//    }
//
//    /**
//     * 幂等性新增或更新记录
//     * 例子如下：
//     * String username = sysUser.getUsername();
//     * boolean result = super.saveOrUpdateIdempotency(sysUser, lock
//     *                 , LOCK_KEY_USERNAME+username
//     *                 , new QueryWrapper<SysUser>().eq("username", username));
//     *
//     * @param entity       实体对象
//     * @param lock         锁实例
//     * @param lockKey      锁的key
//     * @param countWrapper 判断是否存在的条件
//     * @return
//     */
//    @Override
//    public boolean saveOrUpdateIdempotency(T entity, DistributedLock lock, String lockKey, Wrapper<T> countWrapper) {
//        return this.saveOrUpdateIdempotency(entity, lock, lockKey, countWrapper, null);
//    }
}
